﻿#define _CRT_SECURE_NO_WARNINGS 1	//strcpy
#pragma once
#include<iostream>
#include<assert.h>
using namespace std;

namespace bit
{
	class string//使用命名空间隔离一下，避免跟库里面的string类冲突
	{
	public:
		//带参
		//string(const char* str);
		//无参
		//string();

		string(const char* str = "");
		//全缺省：
		// 1.给nullptr不行——和刚才面临的问题一样，同时strlen(str)还会出问题
		// 2.给"\0"也不行——有两个\0，字符串后面默认跟着一个\0
		// 3.给'\0'也不行——char不能转换成const char*
		// 4.最好给""空字符串

		~string();

		const char* c_str() const;

		size_t size() const;
		char& operator[](size_t pos);
		const char& operator[](size_t pos) const;


		typedef char* iterator;//迭代器类似于指针，不一定就是指针，但是可以把它简单实现为指针
		typedef const char* const_iterator;


		char* begin();
		char* end();

		const_iterator begin() const;
		const_iterator end() const;

		void reserve(size_t n);

		void push_back(char ch);
		void append(const char* str);

		string& operator+=(char ch);
		string& operator+=(const char* str);


		void insert(size_t pos, char ch);//在pos位置插入一个字符
		void insert(size_t pos, const char* str);//在pos位置插入一个字符串

		void erase(size_t pos = 0, size_t len = npos);//从pos位置开始删除len个字符
		//声明给缺省值：
		// 当len大于(_size-pos)，或没给len，有多少删多少；
		// 当没给pos，全删

		size_t find(char ch, size_t pos = 0);
		size_t find(const char* str, size_t pos = 0);

		//拷贝构造
		string(const string& s);


		//=重载
		//string& operator=(const string& s);
		string& operator=(string tmp);


		//字符串交换
		void swap(string& s);

		//取子串
		string substr(size_t pos = 0, size_t len = npos);

		//之前说这是一个系列，实现两个就好了——其余的可以复用代码
		bool operator<(const string& s) const;
		bool operator>(const string& s) const;
		bool operator<=(const string& s) const;
		bool operator>=(const string& s) const;
		bool operator==(const string& s) const;
		bool operator!=(const string& s) const;

		void clear();

	private:
		//VS下设计得更复杂，设计了一个_buff数组
		// char _buff[16];
		char* _str = nullptr;

		size_t _size = 0;
		size_t _capacity = 0;
		
		// 静态成员变量如何初始化？？？
		// 静态成员变量在类里面声明，类外面定义
		const static size_t npos;
	};
	//const size_t string::npos = -1;

	istream& operator>> (istream& is, string& str);
	ostream& operator<< (ostream& os, const string& str);
}